home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / AIFF DSP v22 / main_src / Think_C / interface.c next >
Text File  |  1995-01-29  |  5KB  |  137 lines

  1. /*
  2. Contains functions which allow file selection via toolbox routines.
  3.  
  4. PathNameFrom* functions were adapted from sample code in Symantec's _Think Reference_.  Symantec got this code from an Apple Q&A Stack.
  5. Some of the comments in these functions are speculative in that they are my attempt to explain Apple's code.
  6.  
  7. SF???File() reference:
  8. Huxham, Fred A., David Burnard, and Jim Takatsuka.  _Using the Macintosh Toolbox With C_, 2nd ed.  San Francisco: Sybex, 1989. p. 367-73.
  9.  
  10. Assumes #inclusion of MacHeaders (this is implicit in Think C by default).
  11. linkage: needs MacTraps library.
  12. */
  13.  
  14. #include <string.h>
  15. #include <stdio.h>
  16.  
  17. /* PathNameFromDirID() is a utility function used by PathNameFromWD() */
  18. int PathNameFromDirID(long dirID, short vRefNum, char* fullPathName)
  19. {
  20.     CInfoPBRec block;
  21.     Str255 directoryName;
  22.     OSErr err;
  23.  
  24.     *fullPathName = 0;               /* 1 */
  25.     block.dirInfo.ioDrParID = dirID;         /* 2 */
  26.     block.dirInfo.ioNamePtr = directoryName; /* 3 */
  27.     do {
  28.         block.dirInfo.ioVRefNum   = vRefNum;         /* 4 */
  29.         block.dirInfo.ioFDirIndex = -1;              /* 4 */
  30.         block.dirInfo.ioDrDirID   = block.dirInfo.ioDrParID; /* 4,5 */
  31.  
  32.         err = PBGetCatInfo(&block, FALSE);       /* 6 */
  33.         if (err) return 1;
  34.  
  35.         directoryName[++directoryName[0]] = ':'; /* 7  */
  36.  
  37.         PtoCstr(directoryName);                         /* 8 */
  38.         strcat( (char *) directoryName, fullPathName ); /* 9 */
  39.         strcpy( fullPathName, (char *) directoryName ); /* 10 */
  40.     } while (block.dirInfo.ioDrDirID != 2);                     /* 11 */
  41.     return 0;
  42. }
  43. /*
  44. 1. Initialize to the null string
  45. 2. Parent directory = most local directory.  This is an initialization needed before loop entry.  It makes sense if you consider the most local directory the parent directory of the file in question.
  46. 3. Put directory names in "directoryName"
  47. 4. Prepare parameters to be passed in call to PBGetCatInfo();
  48. 5. Set the block's DrDirID to that of its parent.  This is how we travel up the directory tree.
  49. 6. Get catalog information for this block.  In our case, the only info we use is the string at ioNamePtr (directoryName) and ioDrParID.
  50. 7. Append ':' onto the new directory name & increment string length byte directoryName will be of the form "DirName:"
  51. 8. Convert Pascal --> C string format
  52. 9. Append the lower part of the path onto the new directory name. fullPathName will be of the form "DirName2:DirName1:DirName0:"
  53. 10. Make a copy of directoryName in fullPathName since directoryName will be overwritten on next pass through PBGetCatInfo
  54. 11. Stop when the highest level directory (the volume) has been reached
  55. */
  56.  
  57. /*
  58. PathNameFromWD() puts the full pathname of the HFS working directory "vRefNum" into "pathName".
  59. It does this by calling PBGetWDInfo to get the VRefNum and DirID of the real directory. It then calls PathNameFromDirID, and returns its result.
  60. */
  61. int PathNameFromWD(long vRefNum, char* pathName)
  62. {
  63.     WDPBRec myBlock;
  64.     OSErr err;
  65.  
  66.     myBlock.ioNamePtr  = nil;     /* 1 */
  67.     myBlock.ioVRefNum  = vRefNum; /* 1 */
  68.     myBlock.ioWDIndex  = 0;       /* 1 */
  69.     myBlock.ioWDProcID = 0;       /* 1 */
  70.     
  71.     err = PBGetWDInfo(&myBlock, FALSE); /* 2 */
  72.     if (err) return 1;
  73.  
  74.     return
  75.         PathNameFromDirID(myBlock.ioWDDirID, myBlock.ioWDVRefNum, pathName);
  76. }
  77. /*
  78. 1. Prepare parameters to be passed in call to PBGetWDInfo()
  79. 2. Change the Working Directory number in vRefnum into a real
  80.    vRefnum and DirID. The real vRefnum is returned in ioVRefnum,
  81.    and the real DirID is returned in ioWDDirID.
  82. */
  83.  
  84. /*
  85. getfullfstr() gets a full input file name from a dialog box selection. (1)
  86. It displays files of all "numtyp" types specified in "types".
  87. If numtyp == -1, files of all types are displayed.
  88. */
  89. int getfullfstr( Point where, int numtyp, SFTypeList types, char *fstr )
  90. {
  91.     SFReply reply;
  92.     int err;
  93.  
  94.     printf("\n"); /* 2 */
  95.     SFGetFile( where, "\p" , NULL, numtyp, types, NULL, &reply);
  96.  
  97.     if (!reply.good) return 1; /* 3 */
  98.  
  99.     err = PathNameFromWD( reply.vRefNum, fstr ); /* 4 */
  100.     if (err) return 1;
  101.     strcat( fstr, PtoCstr( reply.fName ) ); /* 5 */
  102.     printf( "Input File Chosen:\n%s\n", fstr );
  103.     return 0;
  104. }
  105.  
  106. /*
  107. putfullfstr() gets a full output file name from a dialog box selection. (1)
  108. It displays prompt "prompt" and default file name "fstr" in the dialog box.
  109. */
  110. int putfullfstr( Point where, char *prompt, char *fstr )
  111. {
  112.     SFReply reply;
  113.     int err;
  114.  
  115.     printf("\n"); /* 2 */
  116.     SFPutFile( where, CtoPstr(prompt) , CtoPstr(fstr), NULL, &reply);
  117.  
  118.     if (!reply.good) return 1; /* 3 */
  119.  
  120.     err = PathNameFromWD( reply.vRefNum, fstr ); /* 4 */
  121.     if (err) return 1;
  122.     strcat( fstr, PtoCstr( reply.fName ) ); /* 5 */
  123.     printf( "Output File Chosen:\n%s\n", fstr );
  124.     return 0;
  125. }
  126. /*
  127. 1. The appropriate dialog box is placed at screen location "where".
  128.    The full name of the file chosen is returned in "fstr".
  129.    The function returns 1 on error and zero on no error.
  130.    It is strongly recommended that "fstr" be 256 bytes long, though one could usually get away with a length of about 80.
  131. 2. For reasons unclear to me, it is necessary to write to the console for SF???File() to work.  An error sends me into MacsBug otherwise.
  132. 3. User clicking "Cancel" is considered an error.
  133. 4. Put full path name of directory into fstr.
  134. 5. Append file name to full path name to yield full file name.
  135. */
  136.  
  137.